package modelo.escenario;

import modelo.geometria.Vector;
import modelo.geometria.Rectangulo;

public class Cuadra extends Transitable {
	static final double LARGO_ZONA_EXTREMO = 2; // codifica el largo de las zonas de entrada y salida de la cuadra, que ser�n controladas por el sem�foro.
	
	private Rectangulo zonaComienzo;
	private Rectangulo zonaFin;
	private String id;
	private Cruce cruceOrigen;
	private Cruce cruceDestino;
	private Arteria arteria;
	private Double peso = 1.0;
	
	public Cuadra(String id, Vector centro, double largo, double ancho, Cruce cruceOrigen, Cruce cruceDestino, Arteria arteria, SentidoTransitable sentido) {
		this.id = id;
		this.cruceOrigen = cruceOrigen;
		this.cruceDestino = cruceDestino;
		this.arteria = arteria;
		super.sentido = sentido;
		super.superficie = new Rectangulo(centro, largo, ancho);
	
		double posicionXZonaComienzo = 0;
		double posicionYZonaComienzo = 0;
		double posicionXZonaFin = 0;
		double posicionYZonaFin = 0;
		double longitudXZonaExtremo = 0;
		double longitudYZonaExtremo = 0;

		
		switch (sentido) {
		case NORTE: {
			posicionXZonaComienzo = centro.getX();
			posicionYZonaComienzo = centro.getY() - largo/2;
			posicionXZonaFin = centro.getX();
			posicionYZonaFin = centro.getY() + largo/2;
			longitudXZonaExtremo = ancho;
			longitudYZonaExtremo = LARGO_ZONA_EXTREMO;
		}
		case SUR: {
			posicionXZonaComienzo = centro.getX();
			posicionYZonaComienzo = centro.getY() + largo/2;
			posicionXZonaFin = centro.getX();
			posicionYZonaFin = centro.getY() - largo/2;
			longitudXZonaExtremo = ancho;
			longitudYZonaExtremo = LARGO_ZONA_EXTREMO;		
		}
		case ESTE: {
			posicionXZonaComienzo = centro.getX() - largo/2;
			posicionYZonaComienzo = centro.getY();
			posicionXZonaFin = centro.getX() + largo/2;
			posicionYZonaFin = centro.getY();
			longitudXZonaExtremo = LARGO_ZONA_EXTREMO;
			longitudYZonaExtremo = ancho;
		}			
		case OESTE: {
			posicionXZonaComienzo = centro.getX() + largo/2;
			posicionYZonaComienzo = centro.getY();
			posicionXZonaFin = centro.getX() - largo/2;
			posicionYZonaFin = centro.getY();
			longitudXZonaExtremo = LARGO_ZONA_EXTREMO;
			longitudYZonaExtremo = ancho;
		}
		}
		
		Vector centroZonaComienzo = new Vector(posicionXZonaComienzo, posicionYZonaComienzo);
		Vector centroZonaFin = new Vector(posicionXZonaFin, posicionYZonaFin);
		
		this.zonaComienzo = new Rectangulo(centroZonaComienzo, longitudXZonaExtremo,longitudYZonaExtremo);
		this.zonaFin = new Rectangulo(centroZonaFin, longitudXZonaExtremo,longitudYZonaExtremo);
		
	}

	/**Devuelve el tipo de conexion del cruce con la cuadra*/
	public SentidoTransitable getConexionCruce(Cruce cruce){
		SentidoTransitable s = null;
		if (cruce.equals(cruceOrigen)){
			s = this.sentido;
		}
		else if(cruce.equals(cruceDestino)){
			switch(sentido){
				case NORTE: s = SentidoTransitable.SUR; break;
				case SUR: s = SentidoTransitable.NORTE; break;
				case OESTE: s = SentidoTransitable.ESTE; break;
				case ESTE: s = SentidoTransitable.OESTE; break;
			}
		}
		return s;
	}

	public void setPeso(Double peso) {
		this.peso = peso;
	}

	public Cruce getCruceOrigen() {
		return cruceOrigen;
	}
	public Cruce getCruceDestino() {
		return cruceDestino;
	}
	public String getId(){
		return this.id;
	}
	public String toString(){
		return  "Cuadra " + this.id;
	}
	public Arteria getArteria() {
		return arteria;
	}
	public Double getPeso() {
		return peso;
	}
	
	public Rectangulo getZonaComienzo() {
		return zonaComienzo;
	}
	
	public Rectangulo getZonaFin() {
		return zonaFin;
	}
}
